//////////////////////////////////////////////////////////////////////////////////////////////////////
// 项目名   : StrongEnumerationTypes
// 文件名   : HierarchicalMutex.h
// 作者     : Aiye
// 日期     : 2025/8/27 08:39
// 邮箱     : 2878548868@qq.com
// 摘要     : 简单的层级互斥实现，（数值越表示层级越高：只能从高->低递减获取）
//////////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef STRONGENUMERATIONTYPES_HIERARCHICALMUTEX_H
#define STRONGENUMERATIONTYPES_HIERARCHICALMUTEX_H
#include <mutex>
#include <stdexcept>

/**
 * @brief 层级锁
 */
class HierarchicalMutex
{
public:
    explicit HierarchicalMutex(unsigned long level)
        : _level(level)
    {}

    HierarchicalMutex(const HierarchicalMutex&) = delete;
    HierarchicalMutex operator = (const HierarchicalMutex&) = delete;

public:
    /**
     * @brief 上锁
     */
    void lock()
    {
        checkRole();
        _mutex.lock();
        updateThreadLevel();
    }

    /**
     * @brief 尝试上锁
     * @return 上锁是否成功
     */
    bool tryLock()
    {
        checkRole();
        if (!_mutex.try_lock())
        {
            return false;
        }
        updateThreadLevel();
        return true;
    }

    /**
     * @brief 解锁
     */
    void unlock()
    {
        _threadCurLevel = _preLevel;
        _mutex.unlock();
    }

    auto level() noexcept
    {
        return _threadCurLevel;
    }

private:
    /**
     * @brief 检验是否违反高低顺序
     */
    void checkRole() const
    {
        if (_level > _threadCurLevel)
        {
            throw std::logic_error("HierarchicalMutex: lock order violation");
        }
    }

    /**
     * @brief 更新线程当前层级
     */
    void updateThreadLevel()
    {
        _preLevel = _threadCurLevel;
        _threadCurLevel = _level;
    }

private:
    std::mutex _mutex{};                // 互斥锁
    const unsigned long _level{};       // 等级
    unsigned long _preLevel{};          //

    static thread_local unsigned long _threadCurLevel; // 当前线程层级
};

#endif //STRONGENUMERATIONTYPES_HIERARCHICALMUTEX_H
